package com.java.demo.controller;

import com.java.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

@Controller
public class UserController {

    //1.属性注入 : 优点:简单
    // 缺点:①没办法实现 final 修饰变量注入②适用于IOC容器,兼容性不好③风险因为写法简单违背单一设计原则的概率更大
//    @Autowired   // 注入对象 (更简单的从Spring 容器中读取到对象
//    private UserService userService;


    //2.setter 注入 : 优点:符合单一设计原则(每个方法只传递一个对象
    //缺点 : ①不能注入不可变对象(final修饰的对象)②注入对象可能会被修改的
//    private UserService userService;
//
//    @Autowired
//    public void setUserService(UserService userService) {
//        this.userService = userService;
//    }

    //为什么构造方法可以注入不可变对象,而属性输入和setter注入不能
    //这是java的规定,在java中,被final对象必须满足以下两个条件任意一个:
    //final 修饰的对象,要么直接赋值
    //final 修饰的对象,必须在构造方法中赋值

    //3.构造方法注入
    //如果当前类中只有一个构造方法时,那么 @Autowired 注解可省略
    //优点:①可以注入不可变对象(使用final修饰的对象)②注入的对象不会被改变(构造方法只能执行一次)
    //③构造方法注入可以保证注入对象完全被初始化④可兼容性,通用性更好(所有框架都支持)
//    private UserService userService;
//
//    @Autowired  //可加可不加
//    public UserController(UserService userService) {
//        this.userService = userService;
//    }

    //4.@Resource 注入 缺点:
    //注入时,不能注入到构造方法中
    @Resource
    private UserService userService;
    public void sayHi() {
        System.out.println("com.java-> do UserController sayHi()");

        userService.sayHi();
    }
}